/**
 * EventServer 的链表数据结构
 */
#pragma once

#include "EventObject.h"

/* 链表数据结构，继承使用 */
typedef struct _EventNode EventNode;

struct _EventNode
{
	EventObject parent_instance;

	EventNode *next;

	epointer data;
	void	 (*data_destory)(epointer);
};

#define EVENT_NODE(any) ((EventNode *)any)

extern void	  event_node_init(EventNode *self);
extern void	  event_node_finalize(EventNode *self);
extern EventNode *event_node_new(void);
extern void	  event_node_set_data(EventNode *self, epointer data,
				      void (*data_destory)(epointer));
extern void	  event_node_set_next(EventNode *self, EventNode *next);

/**
 * EventNode Get Data as ReturnType
 * 将 EventNode 对象的 data 字段返回为 RetType 类型
 * @param ENObj : 任意 EventNode 对象
 * @param RetType : 需要从 epointer 转换的类型（注意类型长度对齐）
 */
#define EN_GET_D(ENObj, RetType) ((RetType)(EVENT_NODE(ENObj)->data))

/**
 * EventNode Get Next as ReturnType
 * 将 EventNode 对象的 next 字段返回为 RetType 类型
 * @param ENObj : 任意 EventNode 对象
 * @param RetType : 需要从 epointer 转换的类型（注意需要是 EventNode 对象）
 */
#define EN_GET_NEXT(ENObj, RetType) ((RetType)(EVENT_NODE(ENObj)->next))
